Redondeo

$\newcommand{\RR}{\mathbb{R}}$ $\newcommand{\FF}{\mathbb{F}}$

Tenemos una representación del conjunto no-numerable $\RR$ a través del conjunto finito $\FF$. ¿Cómo podemos pasar de un número real a un número flotante, si el número real no es exactamente representable (lo cual es el caso para ¡casi todos los números reales!)? Extenderemos para este fin los números reales y los flotantes con $\pm \infty$, y hablaremos de los reales extendidos $\RR^* := \RR \cup \{-\infty, +\infty \}$ y $\FF^* := \FF \cup \{-\infty, +\infty \}$.

Un mapeo $\bigcirc: \RR^* \to \FF^*$ es una operación de redondeo si

  • Para toda $x \in \FF^*$, $\bigcirc(x) = x$.
  • Si $x, y \in \RR^*$, y $x \le y$, entonces $\bigcirc(x) \le \bigcirc(y)$.

Es decir, el redondeo deja invariantes los números representables en el sistema de punto flotante, y preserva el orden.

Utilizaremos dos modos de redondeo: $\bigtriangleup$, que redondea para arriba (hacia $+\infty$), y $\bigtriangledown$, que redondea para abajo (hacia $-\infty$). Se definen como sigue:

  • $\bigtriangleup \! (x) := \min \{y \in \FF^*: y \ge x \}$
  • $\bigtriangledown(x) := \max \{y \in \FF^*: y \le x \}$

Hablamos de $x$ redondeado para arriba y $x$ redondeado para abajo, respectivamente; estos dos modos de redondeo se llaman modos de redondeo dirigidos.

Nota que no es evidente cómo implementar estas operaciones en la computadora, ya que ¡no podemos representar los números reales originales!

[1] (i) Si tuviéramos un número real positivo $x$ (es decir, con precisión infinita), ¿cómo podríamos encontrar $\bigtriangleup(x)$ y $\bigtriangledown(x)$?

(ii) Encuentra $\bigtriangleup(0.1)$ y $\bigtriangledown(0.1)$ para aritmética flotante de IEEE. ¿En cuánto difieren? ¿Qué podemos decir sobre el error de redondeo?

[2] Haz de nuevo el ejercicio anterior para $x=1.1$ y para $x=10.1$.

[3] ¿Qué pasa con $\bigtriangleup(x)$ y $\bigtriangledown(x)$ si $x \in \FF^*$?

[4] ¿Cuál es la relación entre $\bigtriangleup(-x)$ y $\bigtriangledown(x)$?

Existen otros modos de redondeo además de los redondeos arriba mencionados:

  • Redondeo a cero (truncamiento): $\square_z(x) = {\rm sign}(x) \max\{y \in \FF^*: y\leq |x| \}$

  • Redondeo al más cercano (round to nearest): como su nombre lo indica, se redondea al número de punto flotante más cercano, usando $\bigtriangleup(x)$ o $\bigtriangledown(x)$ según sea el caso. Definiendo $\mu = (\bigtriangleup(x) + \bigtriangledown(x))/2$, entonces:

\begin{equation} \square_n(x) = \left\{ \begin{array}{1 1} \bigtriangledown(x), &x\in[\bigtriangledown(x),\mu)\\ \bigtriangleup(x), &x\in[\mu,\bigtriangleup(x)].\\ \end{array} \right. \end{equation}
  • Redondeo al más cercano parejo (round to nearest even): es parecido al modo anterior logrando que el redondeo hacia arriba y hacia abajo ocurran con la misma probabilidad. (La sutileza en la definición de $\square_n(x)$ está en que la definición involucra un intervalo cerrado y uno semicerrado.) Este redondeo involucra en la definición la paridad del último dígito de la representación de punto flotante de $\bigtriangleup(x)$ y $\bigtriangledown(x)$. Este modo de redondeo es el modo más común.

Aritmética de punto flotante

¿Cómo podemos hacer aritmética en el mundo de punto flotante?

[5] Encuentra unos ejemplos de pares de números $x , y \in \FF$ tal que $x \oplus y \notin \FF$. (Aquí, $\FF$ denota a los flotantes de doble precisión de IEEE, y $\oplus$ es alguna operación aritmética entre $x$ y $y$.)

[6] ¿Qué podemos hacer al respecto?

[7] En los reales tenemos que, si se cumple $x+y = x+y'$, entonces $y = y'$. ¿Se cumple esto entre los números de punto flotante? Si tu respuesta es no, da un ejemplo.

[8] Analiza el caso de iterar el mapeo $f:[0,1] \to [0,1]$ dado por $f(x) = 3x \mathrm{\ mod\ } 1$, con la condición inicial $x_0 = \frac{1}{10}$:

  1. ¿Qué pasa analíticamente?
  2. ¿Qué pasa numéricamente?
  3. ¿Qué pasa si consideras una condición inicial $x_0$ arbitraria?

[Nota: $\mathrm{mod\ } 1$ quiere decir que sólo consideramos la parte fraccionaria entre $0$ y $1$ de la respuesta en cada paso.]

Aplicando redondeo para obtener resultados garantizados

Ya estamos en condiciones para empezar a hacer cálculos útiles.

Siguiendo al libro de Tucker, consideremos la suma infinita

$$S = \sum_{n=1}^\infty \frac{1}{n^2}.$$

Se sabe que $S = \frac{\pi^2}{6}$.

[9] Calcula $S$ numéricamente de manera ingenua.

Para calcular $S$ de forma numérica pero garantizada, tenemos dos tareas: debemos lidiar con la suma infinita, y luego garantizar que el resultado realmente contenga el valor verdadero.

[10] Sea la cola de la suma $T_N := \sum_{n=N+1}^\infty \frac{1}{n^2}$. Utiliza un argumento geométrico para mostrar que

$$\int_{N+1}^\infty \frac{1}{x^2} dx < T_N < \int_{N+1}^\infty \frac{1}{(x-1)^2} dx,$$

y así encuentra cotas para $T_N$.

[11] Usa redondeo para abajo y arriba para calcular cotas para la parte inicial $S_N := \sum_{n=1}^N n^{-2}$.

[Para cambiar el modo del redondeo en Julia, usamos

set_rounding(Float64, RoundUp)

]

[12] Utiliza tus dos últimos resultados para dar cotas rigurosas (es decir, garantizadas) para $S$.

Verifica que el valor verdadero sí esté contenido adentro de tus cotas.

[13] Repite el cálculo con BigFloat para obtener más precisión.

[En Julia, para cambiar la precisión de los BigFloat, usamos

set_bigfloat_precision(100).

]